package com.pethospital.dao;

import com.pethospital.entity.Appointment;
import com.pethospital.entity.PageResult;

import java.sql.Date;
import java.util.List;

/**
 * 预约数据访问接口
 * Appointment Data Access Object Interface
 * 
 * @author PetHospital System
 * @version 1.0
 */
public interface AppointmentDao {
    
    /**
     * 根据预约ID查询预约
     * 
     * @param appointmentId 预约ID
     * @return Appointment 预约对象，如果不存在返回null
     */
    Appointment findById(Integer appointmentId);
    
    /**
     * 根据主人ID查询预约列表
     * 
     * @param ownerId 主人ID
     * @return List<Appointment> 预约列表
     */
    List<Appointment> findByOwnerId(Integer ownerId);
    
    /**
     * 根据宠物ID查询预约列表
     * 
     * @param petId 宠物ID
     * @return List<Appointment> 预约列表
     */
    List<Appointment> findByPetId(Integer petId);
    
    /**
     * 添加预约
     * 
     * @param appointment 预约对象
     * @return int 影响的行数
     */
    int insert(Appointment appointment);
    
    /**
     * 更新预约信息
     * 
     * @param appointment 预约对象
     * @return int 影响的行数
     */
    int update(Appointment appointment);
    
    /**
     * 删除预约
     * 
     * @param appointmentId 预约ID
     * @return int 影响的行数
     */
    int delete(Integer appointmentId);
    
    /**
     * 批量删除预约
     * 
     * @param appointmentIds 预约ID数组
     * @return int 影响的行数
     */
    int batchDelete(Integer[] appointmentIds);
    
    /**
     * 查询所有预约
     * 
     * @return List<Appointment> 预约列表
     */
    List<Appointment> findAll();
    
    /**
     * 分页查询预约
     * 
     * @param currentPage 当前页码
     * @param pageSize 每页大小
     * @return PageResult<Appointment> 分页结果
     */
    PageResult<Appointment> findByPage(int currentPage, int pageSize);
    
    /**
     * 根据主人ID分页查询预约
     * 
     * @param ownerId 主人ID
     * @param currentPage 当前页码
     * @param pageSize 每页大小
     * @return PageResult<Appointment> 分页结果
     */
    PageResult<Appointment> findByOwnerIdAndPage(Integer ownerId, int currentPage, int pageSize);
    
    /**
     * 根据条件分页查询预约
     * 
     * @param petName 宠物姓名（模糊查询）
     * @param serviceType 服务类型
     * @param status 预约状态
     * @param appointmentDate 预约日期
     * @param ownerId 主人ID（可选，为null时查询所有）
     * @param currentPage 当前页码
     * @param pageSize 每页大小
     * @return PageResult<Appointment> 分页结果
     */
    PageResult<Appointment> findByCondition(String petName, String serviceType, String status, 
                                          Date appointmentDate, Integer ownerId, int currentPage, int pageSize);
    
    /**
     * 统计预约总数
     * 
     * @return long 预约总数
     */
    long countAll();
    
    /**
     * 根据主人ID统计预约数量
     * 
     * @param ownerId 主人ID
     * @return long 预约数量
     */
    long countByOwnerId(Integer ownerId);
    
    /**
     * 根据预约状态统计数量
     * 
     * @param status 预约状态
     * @return long 预约数量
     */
    long countByStatus(String status);
    
    /**
     * 根据日期统计预约数量
     *
     * @param appointmentDate 预约日期
     * @return long 预约数量
     */
    long countByDate(Date appointmentDate);

    /**
     * 统计今日预约数量
     *
     * @return long 今日预约数量
     */
    long countTodayAppointments();

    /**
     * 根据主人ID统计今日预约数量
     *
     * @param ownerId 主人ID
     * @return long 今日预约数量
     */
    long countTodayAppointmentsByOwnerId(Integer ownerId);

    /**
     * 根据主人ID统计待处理预约数量
     *
     * @param ownerId 主人ID
     * @return long 待处理预约数量
     */
    long countPendingAppointmentsByOwnerId(Integer ownerId);
    
    /**
     * 更新预约状态
     * 
     * @param appointmentId 预约ID
     * @param status 预约状态
     * @return int 影响的行数
     */
    int updateStatus(Integer appointmentId, String status);
    
    /**
     * 分配医生
     * 
     * @param appointmentId 预约ID
     * @param doctorName 医生姓名
     * @return int 影响的行数
     */
    int assignDoctor(Integer appointmentId, String doctorName);
    
    /**
     * 获取预约状态统计信息
     * 
     * @return List<Object[]> 统计结果，每个数组包含[状态, 数量]
     */
    List<Object[]> getStatusStatistics();
    
    /**
     * 获取服务类型统计信息
     * 
     * @return List<Object[]> 统计结果，每个数组包含[服务类型, 数量]
     */
    List<Object[]> getServiceTypeStatistics();
    
    /**
     * 查询今日预约
     * 
     * @return List<Appointment> 今日预约列表
     */
    List<Appointment> findTodayAppointments();
    
    /**
     * 查询待处理预约
     * 
     * @return List<Appointment> 待处理预约列表
     */
    List<Appointment> findPendingAppointments();
    
    /**
     * 查询即将到期的预约（未来7天内）
     *
     * @return List<Appointment> 即将到期的预约列表
     */
    List<Appointment> findUpcomingAppointments();

    /**
     * 根据主人ID查询最近的预约记录
     *
     * @param ownerId 主人ID
     * @param limit 限制数量
     * @return List<Appointment> 最近的预约列表
     */
    List<Appointment> findRecentByOwnerId(Integer ownerId, int limit);
    
    /**
     * 检查时间冲突
     * 
     * @param appointmentDate 预约日期
     * @param appointmentTime 预约时间
     * @param excludeId 排除的预约ID（用于更新时排除自己）
     * @return boolean 是否存在冲突
     */
    boolean checkTimeConflict(Date appointmentDate, java.sql.Time appointmentTime, Integer excludeId);
}
